<?php

/**
 * Класс для работы с таблицей заявок
 *
 * @author kingop
 */
class DatabaseObject_Requests extends DatabaseObject {

    public $files = null;
    public $user = null;
    public $tender = null;
   public $winner = null;
    public function __construct($db) {
        parent::__construct($db, 'requests', 'id');

        $this->add('idUser');           // пользователь

        $this->add('idTender');         // тендер

        $this->add('firm_name');        // Полное юридическое название компании, 
        // год создания, юридический и фактический адрес, 
        // количество сотрудников (детально ИТР и работники)

        $this->add('firm_info');        // Информация о предоставляемых услугах или поставляемой продукции

        $this->add('firm_zavod');       // Наименование завода-производителя (для ТМЦ)

        $this->add('firm_manager_fio'); // ФИО руководителя предприятия

        $this->add('firm_face_info');   // ФИО ответственного лица, контактный телефон, должность

        $this->add('firm_ext_info');    // Телефон\факс предприятия, эл.почта, официальный сайт

        $this->add('gosreg_copy');      // Копия Свидетельства о государственной регистрации 
        // субъекта предпринимательской деятельности - юридического лица

        $this->add('egrpou');           // Копия справки ЕГРПОУ

        $this->add('nds');              // Копия справки плательщика НДС (плательщика единого налога)

        $this->add('agree_face');       // Копия доверенности либо иного документа, 
        // подтверждающего полномочия лица, 
        // действующего от имени стороны по Договору (подписывающего Договор)

        $this->add('ustav_copy');       // Копия Устава (выписка из Устава, но в любом случае титульный лист, 
        // разделы, содержащие: наименование, адрес, цель и виды деятельности, 
        // юридический статус предприятия, полномочия органов управления), 
        // с изменениями и дополнениями при наличии

        $this->add('allow_docs');       // Разрешительные документы на осуществление видов деятельности – 
        // производство, ремонт, строительство и т.д. 
        // (сертификаты, лицензии, заключения, ТУ, документы соответствия и.д.)

        $this->add('pass_page');        // Копию страницы паспорта, содержащую образец подписи лица, 
        // уполномоченного подписывать документы, 
        // либо копию банковской карточки с образцом подписи данного лица

        $this->add('doc_director');     // Копия документа о назначении директора

        $this->add('bank_info');        // Банковские реквизиты

        $this->add('gni');              //Копия отчетности в ГНИ по форме Ф.1 и Ф.2 за прошлый год и последний отчетный период

        $this->add('suggest');          // Смета, коммерческое предложение

        $this->add('people');           // Перечень специалистов, которые будут принимать участие в выполнении заказа
        // (ФИО, должность, квалификация, опыт работы, телефон)

        $this->add('is_soft');          // Наличие программного обеспечения

        $this->add('expr');             // Опыт выполнения подобных заказов за последние 2 года 
        // (наименование заказчика, сумма договора, сроки выполнения, наименование объекта,город)

        $this->add('recomend');         // Рекомендательные письма заказчиков (при наличии)

        $this->add('main_distr');       // Перечень основных поставщиков 
        // (наименование, адрес, вид продукции, работ, контактный телефон)

        $this->add('tech');             // Перечень имеющейся техники (при необходимости для выполнения работ)

        $this->add('dtime');            // дата подачи

        $this->add('isApproved');       // принята или нет

        $this->add('isDeleted');        // отклонена или нет

        $this->add('deleteReason');     // причина отклонения
    }

    public static function GetRequests($db, $options) {
        // инициализируем настройки
        $defaults = array(
            'offset' => 0,
            'limit' => 0,
            'order' => 'c.id'
        );

        foreach ($defaults as $k => $v) {
            $options[$k] = array_key_exists($k, $options) ? $options[$k] : $v;
        }

        $select = self::_GetBaseQuery($db, $options);

        // поля для выборки
        $select->from(null, 'c.*');

        // зададим настройки
        if ($options['limit'] > 0)
            $select->limit($options['limit'], $options['offset']);
        if ($options['where'])
            $select->where($options['where']);



        $select->order($options['order']);

        // получим данные из базы
        $data = $db->fetchAll($select);

        // сделаем из полученных записей объекты класса
        $requests = self::BuildMultiple($db, __CLASS__, $data);
        $request_ids = array_keys($requests);

        if (count($request_ids) == 0)
            return array();

        foreach ($requests as $request) {
            $request->user = new DatabaseObject_User($db);
            $request->user->load($request->idUser);
            $request->tender = new DatabaseObject_Tender($db);
            $request->tender->load($request->idTender);
            $request->winner = new DatabaseObject_TendersWinners($db);
            $request->winner->load($request->idTender, 'idTender');
        }

        return $requests;
    }

    private static function _GetBaseQuery($db, $options = array()) {
        // инициализация настроек
        $defaults = array();

        foreach ($defaults as $k => $v) {
            $options[$k] = array_key_exists($k, $options) ? $options[$k] : $v;
        }

        // создание запроса на получение
        $select = $db->select();
        $select->from(array('c' => 'requests'), array());

        return $select;
    }

    protected function preDelete() {
        parent::preDelete();

        // удалим файлы
        DatabaseObject_RequestFiles::DeleteRequestsFiles($this->getDb(), $this->getId());

        return true;
    }

    protected function postLoad() {
        parent::postLoad();

        $this->user = new DatabaseObject_User($this->getDb());
        $this->user->load($this->idUser);

        $this->tender = new DatabaseObject_Tender($this->getDb());
        $this->tender->load($this->idTender);

          // загрузим прикрпленные файлы
        $this->files = DatabaseObject_RequestFiles::GetRequestsFiles($this->getDb(), $this->getId());
        
        return true;
    }

    protected function preInsert() {
        parent::preInsert();

        $this->dtime = date("Y-m-d H:i:s");

        return true;
    }

    public static function DeleteUserRequests($db, $id) {
        $uRequests = self::GetRequests($db, array('where' => 'idUser = ' . $id));

        foreach ($uRequests as $request) {
            $request->delete();
        }

        return true;
    }

    public static function GetRequestsCount($db) {
        $select = self::_GetBaseQuery($db, array());
        $select->from(null, 'count(*)');

        return $db->fetchOne($select);
    }
    
    public static function GetApprovedCount($db) {
        $select = self::_GetBaseQuery($db, array());
        $select->from(null, 'count(*)');
        $select->where('isApproved = 1');

        return $db->fetchOne($select);
    }
    
    public static function GetDeclinedCount($db) {
        $select = self::_GetBaseQuery($db, array());
        $select->from(null, 'count(*)');
        $select->where('isDeleted = 1');

        return $db->fetchOne($select);
    }
    
    public static function GetUnknownCount($db) {
        $select = self::_GetBaseQuery($db, array());
        $select->from(null, 'count(*)');
        $select->where('isApproved = 0 and isDeleted = 0');

        return $db->fetchOne($select);
    }
    
    public static function CanSendRequest($db, $idUser, $idTender) {
        $select = self::_GetBaseQuery($db, array());
        $select->from(null, 'count(*)');
        $select->where('idUser = ' . $idUser . ' and idTender = ' . $idTender);

        return $db->fetchOne($select) == 0;
    }
    
     public static function FilterRequests($db, $filter = array(), $options = array()) {
        // инициализируем настройки
        $defaults = array(
            'offset' => 0,
            'limit' => 0,
            'order' => 'c.id'
        );
        $filters = array(
            'idCat' => 0,
            'idProject' => 0,
            'idUser' => 0,
            'isApproved' => 2
        );
      
        foreach ($defaults as $k => $v) {
            $options[$k] = array_key_exists($k, $options) ? $options[$k] : $v;
        }

        foreach ($filters as $k => $v) {
            $filter[$k] = array_key_exists($k, $filter) ? $filter[$k] : $v;
        }
        if (count($filter['idCat'])>0 || count($filter['idProject'])>0){
        $tenders = DatabaseObject_Tender::FilterTenders($db, array('idCat' => $filter['idCat'], 'idProject' => $filter['idProject']));
        if (count($tenders)== 0) return array();
    
        foreach ($tenders as $tender) {
            $idTender[] =$tender->getId(); 
         }
         
        }
      
        $select = self::_GetBaseQuery($db, $options);
     
   //   if (count($filter['idCat']) > 0)   $idCat = implode(",", $filter['idCat']);
     // if (count($filter['idProject']) > 0)       $idProject = implode(",", $filter['idProject']);
        
      if (count($filter['idUser']) > 0)       $idUser = implode(",", $filter['idUser']);
      if (count($idTender) > 0)       $idTender = implode(",", $idTender);
        // поля для выборки
        $select->from(null, 'c.*');
       /* if ($idCat != '')
            $select->where('idCat in (' . $idCat . ')');
        if ($idProject != '')
            $select->where('idProject in (' . $idProject . ')');*/
        ////////////////////////////////////////////
     $select->joinLeft(array('t' => 'tenders'),
                                     'c.idTender=t.id ',
                                     array());
      $select->joinLeft(array('u' => 'users'),
                                     'c.idUser=u.id',
                                     array());
        if ($idUser != '')
        {$select->where('c.idUser in (' . $idUser . ')'); $where .='idUser in (' . $idUser . ')';}
        if ($idTender != '')
        { $select->where('c.idTender in (' . $idTender . ')');$where .='idTender in (' . $idTender . ')';}
        if (($filter['isApproved'] != '') && ($filter['isApproved']!= '2')) {  $select->where('c.isApproved = ?', $filter['isApproved']);
        $where .='isApproved = '. $filter['isApproved'];
        }
        // зададим настройки
        if ($options['limit'] > 0)
            $select->limit($options['limit'], $options['offset']);
        if ($where !='') $where = "WHERE ".$where; 
        $select->order($options['order']);
       //  $query = "select r.*,r.id as id from requests as r left join tenders as t on r.idTender=t.id left join users as u on r.idUser=u.id   ".$where." order by ".$options['order']."";
        // получим данные из базы
       
        $data = $db->fetchAll($select);

        // сделаем из полученных записей объекты класса
        $requests = self::BuildMultiple($db, __CLASS__, $data);
        
     
        $request_ids = array_keys($requests);

        if (count($request_ids) == 0)
            return array();

          foreach ($requests as $request) {
            $request->user = new DatabaseObject_User($db);
            $request->user->load($request->idUser);
            $request->tender = new DatabaseObject_Tender($db);
            $request->tender->load($request->idTender);
            $request->winner = new DatabaseObject_TendersWinners($db);
            $request->winner->load($request->getId(), 'idRequest');
        }
        return $requests;
    }
    
    public static function GetRequestsCountFilter($db, $filter = array(), $options = array()) {
        // инициализируем настройки
        $defaults = array(
            'offset' => 0,
            'limit' => 0,
            'order' => 'c.id'
        );
        $filters = array(
            'idCat' => 0,
            'idProject' => 0,
            'idUser' => 0,
            'isApproved' => 2
        );
      
        foreach ($defaults as $k => $v) {
            $options[$k] = array_key_exists($k, $options) ? $options[$k] : $v;
        }

        foreach ($filters as $k => $v) {
            $filter[$k] = array_key_exists($k, $filter) ? $filter[$k] : $v;
        }
        if (count($filter['idCat'])>0 || count($filter['idProject'])>0){
        $tenders = DatabaseObject_Tender::FilterTenders($db, array('idCat' => $filter['idCat'], 'idProject' => $filter['idProject']));
        if (count($tenders)== 0) return array();
    
        foreach ($tenders as $tender) {
            $idTender[] =$tender->getId(); 
         }
         
        }
      
        $select = self::_GetBaseQuery($db, $options);
     
   //   if (count($filter['idCat']) > 0)   $idCat = implode(",", $filter['idCat']);
     // if (count($filter['idProject']) > 0)       $idProject = implode(",", $filter['idProject']);
        
      if (count($filter['idUser']) > 0)       $idUser = implode(",", $filter['idUser']);
      if (count($idTender) > 0)       $idTender = implode(",", $idTender);
        // поля для выборки
       $select->from(null, 'count(*)');
       /* if ($idCat != '')
            $select->where('idCat in (' . $idCat . ')');
        if ($idProject != '')
            $select->where('idProject in (' . $idProject . ')');*/
        ////////////////////////////////////////////
     $select->joinLeft(array('t' => 'tenders'),
                                     'c.idTender=t.id ',
                                     array());
      $select->joinLeft(array('u' => 'users'),
                                     'c.idUser=u.id',
                                     array());
        if ($idUser != '')
        {$select->where('c.idUser in (' . $idUser . ')'); $where .='idUser in (' . $idUser . ')';}
        if ($idTender != '')
        { $select->where('c.idTender in (' . $idTender . ')');$where .='idTender in (' . $idTender . ')';}
        if (($filter['isApproved'] != '') && ($filter['isApproved']!= '2')) {  $select->where('c.isApproved = ?', $filter['isApproved']);
        $where .='isApproved = '. $filter['isApproved'];
        }
        // зададим настройки
        if ($options['limit'] > 0)
            $select->limit($options['limit'], $options['offset']);
        if ($where !='') $where = "WHERE ".$where; 
        //$select->order($options['order']);
       //  $query = "select r.*,r.id as id from requests as r left join tenders as t on r.idTender=t.id left join users as u on r.idUser=u.id   ".$where." order by ".$options['order']."";
        // получим данные из базы
       
        /*$data = $db->fetchAll($select);

        // сделаем из полученных записей объекты класса
        $requests = self::BuildMultiple($db, __CLASS__, $data);
        
     
        $request_ids = array_keys($requests);

        if (count($request_ids) == 0)
            return array();

          foreach ($requests as $request) {
            $request->user = new DatabaseObject_User($db);
            $request->user->load($request->idUser);
            $request->tender = new DatabaseObject_Tender($db);
            $request->tender->load($request->idTender);
        }*/
        
        
        
        return $db->fetchOne($select);
    }
}

?>
